/**
 * @file    drv_flash2eep.h
 * @author  yhy
 * @brief   flash模拟eeprom
 * @version 1.00
 * @date    2025-08-14
 *
 * @copyright Copyright (c) 2025
 *
 * @details
 * Change Logs:
 * Date           Author       Notes
 * 2025-08-14     yhy          the first version V1.00
 *
 */
#ifndef __DRV_FLASH2EEP_H__
#define __DRV_FLASH2EEP_H__

#include "drv_flash.h"

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>

/* EEPROM配置参数 */
#define EEPROM_SECTOR_SIZE  (64 * 1024)                                /* 64KB扇区大小 */
#define EEPROM_SECTOR_COUNT 2                                          /* 双扇区 */
#define EEPROM_TOTAL_SIZE   (EEPROM_SECTOR_SIZE * EEPROM_SECTOR_COUNT) /* 总128KB */
#define EEPROM_MAX_INDEX    255                                        /* 最大索引 */
#define EEPROM_MAX_DATA_LEN 255                                        /* 最大数据长度255字节 */
#define EEPROM_ALIGN_SIZE   8                                          /* 8字节对齐 */
#define EEPROM_MAGIC_HEADER FLASH_PART_MAGIC_WORD                      /* 魔术字 */
#define EEPROM_PADDING_BYTE 0xFF                                       /* 填充字节 */

/**
 * @brief 数据结顶头部结构体（4字节， 保证8字节对齐）
 *
 */
typedef struct __attribute__((packed))
{
    uint16_t magic;   /*!< 魔数标识 EP10 */
    uint8_t  index;   /*!< 逻辑索引 0-255 */
    uint8_t  length;  /*!< 数据长度 1-255 */
    uint16_t crc;     /*!< CRC16校验 */
    uint16_t version; /*!< 版本计数器 */
} eeprom_item_header_t;

/**
 * @brief 索引映射表结构体
 *
 */
typedef struct
{
    uint32_t addr;    /*!< 物理地址 */
    uint16_t version; /*!< 版本号 */
    uint8_t  length;  /*!< 数据长度 */
    bool     valid;   /*!< 有效标志 */
} eeprom_index_map_t;

/**
 * @brief EEPROM状态结构
 *
 */
typedef struct
{
    uint8_t            active_sector;                         /*!< 当前活动扇区 0/1  */
    uint32_t           write_ptr;                             /*!< 写入指针（8字节对齐） */
    uint32_t           free_space;                            /*!< 剩余空间 */
    uint16_t           valid_items;                           /*!< 有效数据项数量 */
    uint32_t           alignment_errors;                      /*!< 对齐错误计数 */
    bool               initialized;                           /*!< 初始化标志 */
    uint32_t           sector_use_count[EEPROM_SECTOR_COUNT]; /*!< 各扇区使用次数统计 */
    uint32_t           sector_migration_count;                /*!< 扇区迁移总次数 */
    uint32_t           last_migration_time;                   /*!< 上次迁移时间戳（可选） */
    uint8_t            preferred_sector;                      /*!< 优选扇区（负载均衡用） */
    eeprom_index_map_t index_map[EEPROM_MAX_INDEX + 1];       /*!< 索引映射表 */
} eeprom_status_t;

result_e         snf_flash2eep_init(void);
result_e         snf_flash2eep_write(uint8_t index, const uint8_t *data, uint8_t length);
int              snf_flash2eep_read(uint8_t index, uint8_t *buf, uint8_t buf_size);
result_e         snf_flash2eep_register(uint8_t index);
eeprom_status_t *snf_flash2eep_get_status(void);
result_e         snf_flash2eep_format(void);
result_e         snf_flash2eep_force_migrate(void); /*!< 强制触发扇区迁移 */

#endif
